/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Xadrez.Modelo;

/**
 *
 * @author Leonardo
 */
public class Pawn extends Piece { 

        

    public Pawn() {
    }

    public Pawn(String color) {

        this.setColor(color);
        this.setFirstMove(true);
        this.setEnPassant(false);
        


    }
    
    

    @Override
    public boolean move(Move m, Board board){

        boolean done = false;

        if (isValidMove(m, board)) {
            
            int tamanhoDoPasso = Math.abs(m.getOrigin().getPositionY() - m.getDestination().getPositionY());

            if(Math.abs(m.getDestination().getPositionX() - m.getOrigin().getPositionX())>0){
                if(m.getDestination().getPiece() == null){
                    //se o peão foi pro lado, e pra onde ele foi, não tinha peça
                    //então ele capturou por en passant
                    board.getGrid()[m.getDestination().getPositionX()][m.getOrigin().getPositionY()].setPiece(null);

                }
            }

            m.getDestination().setPiece(this);
            m.getOrigin().setPiece(null);


            
            if(this.isFirstMove()) {
                this.setFirstMove(false);
                if(tamanhoDoPasso == 2) {
                    
                    this.setEnPassant(true);
                }
            }
            done = true;

        }
        return done;

    }

    @Override
    public boolean isValidMove(Move m, Board board) {
        

        boolean validate = false;

        Square origem = m.getOrigin();
        Square destino = m.getDestination();

        if (m.onLimits()) {

            if (destino.getPiece() != null) {
                if (destino.getPiece().getColor().equals(origem.getPiece().getColor())) {
                    validate = false;
                } else {

                    validate = checkPosition(origem, destino, board);

                }
            } else {
                validate = checkPosition(origem, destino, board);
                System.out.print(validate);
            }


        }

        return validate;
    }

    private boolean checkPosition(Square origem, Square destino, Board board) {
        boolean validate = false;

        Square[] possibleDestiny = new Square[64];
        int countDestiny = 0;



        if (origem.getPiece().getColor().equals("Black")) {

            if (board.getGrid()[origem.getPositionX()][origem.getPositionY() + 1].getPiece() == null) {

                possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX()][origem.getPositionY() + 1];
                countDestiny++;

                if (origem.getPiece().isFirstMove()) {
                    if (board.getGrid()[origem.getPositionX()][origem.getPositionY() + 2].getPiece() == null) {

                        possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX()][origem.getPositionY() + 2];
                        countDestiny++;
                    }

                }

            }

            if (origem.getPositionX() + 1 < 8) {

                if (board.getGrid()[origem.getPositionX() + 1][origem.getPositionY() + 1].getPiece() != null) {

                    if (!board.getGrid()[origem.getPositionX() + 1][origem.getPositionY() + 1].getPiece().getColor().equals(origem.getPiece().getColor())) {
                        possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX() + 1][origem.getPositionY() + 1];
                        countDestiny++;
                    }
                }


            }


            if (origem.getPositionX() - 1 >= 0) {

                if (board.getGrid()[origem.getPositionX() - 1][origem.getPositionY() + 1].getPiece() != null) {

                    if (!board.getGrid()[origem.getPositionX() - 1][origem.getPositionY() + 1].getPiece().getColor().equals(origem.getPiece().getColor())) {
                        possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX() - 1][origem.getPositionY() + 1];
                        countDestiny++;
                    }

                }

            }

            //Adicional en passant
            if (origem.getPositionX() - 1 >= 0)
                if (board.getGrid()[origem.getPositionX() - 1][origem.getPositionY()].getPiece() != null)
                    if (board.getGrid()[origem.getPositionX() - 1][origem.getPositionY()].getPiece() instanceof Pawn)
                        if (!board.getGrid()[origem.getPositionX() - 1][origem.getPositionY()].getPiece().getColor().equals(this.getColor()) )
                        if (board.getGrid()[origem.getPositionX() - 1][origem.getPositionY()].getPiece().getEnPassant()) {
                            possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX() - 1][origem.getPositionY() + 1];
                            countDestiny++;
                        }

            if (origem.getPositionX() + 1 <= 7)
                if (board.getGrid()[origem.getPositionX() + 1][origem.getPositionY()].getPiece() != null)
                    if (board.getGrid()[origem.getPositionX() + 1][origem.getPositionY()].getPiece() instanceof Pawn)
                        if (!board.getGrid()[origem.getPositionX() + 1][origem.getPositionY()].getPiece().getColor().equals(this.getColor()) )
                        if (board.getGrid()[origem.getPositionX() + 1][origem.getPositionY()].getPiece().getEnPassant()) {
                            possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX() + 1][origem.getPositionY() + 1];
                            countDestiny++;
                        }








        } else {

            if (board.getGrid()[origem.getPositionX()][origem.getPositionY() - 1].getPiece() == null) {

                possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX()][origem.getPositionY() - 1];
                countDestiny++;

                if (origem.getPiece().isFirstMove()) {

                    if (board.getGrid()[origem.getPositionX()][origem.getPositionY() - 2].getPiece() == null) {

                        possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX()][origem.getPositionY() - 2];
                        countDestiny++;
                    }

                }

            }



            if (origem.getPositionX() + 1 < 8) {

                if (board.getGrid()[origem.getPositionX() + 1][origem.getPositionY() - 1].getPiece() != null) {

                    if (!board.getGrid()[origem.getPositionX() + 1][origem.getPositionY() - 1].getPiece().getColor().equals(origem.getPiece().getColor())) {
                        possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX() + 1][origem.getPositionY() - 1];
                        countDestiny++;
                    }

                }


            }

            if (origem.getPositionX() - 1 >= 0) {
                if (board.getGrid()[origem.getPositionX() - 1][origem.getPositionY() - 1].getPiece() != null) {

                    if (!board.getGrid()[origem.getPositionX() - 1][origem.getPositionY() - 1].getPiece().getColor().equals(origem.getPiece().getColor())) {
                        possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX() - 1][origem.getPositionY() - 1];
                        countDestiny++;
                    }

                }


            }

            //Adicional en passant
            if (origem.getPositionX() - 1 >= 0)
                if (board.getGrid()[origem.getPositionX() - 1][origem.getPositionY()].getPiece() != null)
                    if (board.getGrid()[origem.getPositionX() - 1][origem.getPositionY()].getPiece() instanceof Pawn)
                        if (!board.getGrid()[origem.getPositionX() - 1][origem.getPositionY()].getPiece().getColor().equals(this.getColor()) )
                        if (board.getGrid()[origem.getPositionX() - 1][origem.getPositionY()].getPiece().getEnPassant()) {
                            possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX() - 1][origem.getPositionY() - 1];
                            countDestiny++;
                        }

            if (origem.getPositionX() + 1 <= 7)
                if (board.getGrid()[origem.getPositionX() + 1][origem.getPositionY()].getPiece() != null)
                    if (board.getGrid()[origem.getPositionX() + 1][origem.getPositionY()].getPiece() instanceof Pawn)
                        if (!board.getGrid()[origem.getPositionX() + 1][origem.getPositionY()].getPiece().getColor().equals(this.getColor()) )
                        if (board.getGrid()[origem.getPositionX() + 1][origem.getPositionY()].getPiece().getEnPassant()) {
                            possibleDestiny[countDestiny] = board.getGrid()[origem.getPositionX() + 1][origem.getPositionY() - 1];
                            countDestiny++;
                        }



        }

        for (int i = 0; i <= countDestiny - 1; i++) {



            if (destino == possibleDestiny[i]) {
                validate = true;
                break;
                
            }

        }


        return validate;
    }

    public String toString() {
        System.out.println("peão");
        return "peão";
    }
}
